package metier.outils;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;

import metier.modele.Figure;

/**
 * Figure => Trait
 * @author Quentin, Vincent, Charlie
 *
 */
public class Tools_Trait extends Figure {

	private static final long serialVersionUID = -7725934613802736223L;

	public void setDonnees(int x1, int y1, int x2, int y2) {
		setX1(x1);
		setY1(y1);
		setX2(x2);
		setY2(y2);
	}

	/**
	 * Tracé du trait
	 */
	public void tracer(Graphics g, boolean couleursVraies, boolean edit,
			Color color) {

		Color cfg;

		if (couleursVraies == true) {
			cfg = getFg();
		} else {
			cfg = color;
		}

		g.setColor(cfg);
		g.drawLine(getX1(), getY1(), getX2(), getY2());

		if (edit == true)
			addEditRect(g);
		
		if (getStatus() == Figure.SUPPRESSION)
			addDeleteRect((Graphics2D) g);
	}

	
	public void addDeleteRect(Graphics2D g)
	{
		int offset = Tools.EDIT_RECT_SIZE;
		float epaisseur=1;
		float[] style = {10,5};
		int x1 = Math.min(getX1(), getX2());
		int y1 = Math.min(getY1(), getY2());
		int x2 = Math.max(getX1(), getX2());
		int y2 = Math.max(getY1(), getY2());
		//System.out.println(getX1()+","+getY1()+" "+getX2()+","+getY2()+" "+x1+","+y1+" "+x2+","+y2);
		g.setStroke( new BasicStroke( 
		        epaisseur,
		        BasicStroke.CAP_BUTT,
		        BasicStroke.JOIN_MITER,
		        10.0f,
		        style,
		        0
		        ));
		
		g.drawRect(x1 - offset, y1 - offset, Math.abs(x2 - x1) + 2*offset, Math
				.abs(y2 - y1) + 2*offset);
		
		
		g.setStroke( new BasicStroke(1.0f) );
	}
	
	/**
	 * Ajout des petits rectangles de 
	 * redimensionnement
	 * @param g
	 */
	public void addEditRect(Graphics g) {
		int offset = Tools.EDIT_RECT_SIZE;
		g.fillRect(getX1() - offset / 2, getY1() - offset / 2, offset, offset); // Haut
																				// gauche
		g.fillRect(getX2() - offset / 2, getY2() - offset / 2, offset, offset); // Bas
																				// droit
	}

	/**
	 * Est-ce qu'on est dans la figure ?
	 */
	public boolean pointInFigure(Point p)
	{	
		return pointOnFigure(p);
	}

	/**
	 * Est-ce qu'on est sur la figure ?
	 */
	public boolean pointOnFigure(Point p) {
		Point p1 = new Point(getX1(), getY1());
		Point p2 = new Point(getX2(), getY2());
		if (distanceToSegment(p1, p2, p) < Tools.MIN_DISTANCE)
			return true;
		return false;
	}

	/**
	 * Est-ce qu'on est dans les petits
	 * rectangles de redimensionnement ?
	 */
	public int pointInEditFigure(Point p) {
		int x = p.x;
		int y = p.y;
		int offset = Tools.EDIT_RECT_SIZE / 2;
		if ((x >= getX1() - offset && x <= getX1() + offset)
				&& (y >= getY1() - offset && y <= getY1() + offset))
			return 2;
		if ((x >= getX2() - offset && x <= getX2() + offset)
				&& (y >= getY2() - offset && y <= getY2() + offset))
			return 1;
		else
			return 0;
	}

}